Technote 1131

Creating Desktop Printers on the Fly


ñ⁄éü

äTóv

ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉeÉBÉìÉOÇΔÇÕ

ä¬ã´ÇÃÉ`ÉFÉbÉN

ÉAÉbÉvÉãÉvÉäÉìÉ^ópÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÃçÏê¨

StyleWriter

LaserWriter 8.4.3 Ç®ÇÊǗǪÇÍà»ëO (PAP ÇÃÇ›)

LaserWriter 8.5.1 à»ç~ (PAPÅALPRÅAê‘äOê¸ÅAï€óØÅAÉgÉâÉìÉXÉåÅ[É^ÅAÉJÉXÉ^ÉÄ)

Ç‹ÇΔÇfl

DZÇà TECHNOTE Ç≈ÇÕÅAÉÜÅ[ÉUÇ…ÉZÉåÉNÉ^ÇégÇÌÇπǻǢÇ≈ÅAÉvÉçÉOÉâÉÄÇ™ìÆçÏíÜÇ…ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇçÏê¨Ç∑ÇÈï˚ñ@Çê‡ñæÇµÇ‹Ç∑ÅB

íçà”: ÉÜÅ[ÉUÇ…âΩLJímÇÁÇπÇ∏Ç…ÉAÉvÉäÉPÅ[ÉVÉáÉìÇ≈DZÇÃï˚ñ@ÇégópÇ∑ÇÈDZÇΔÇÕÇ®Ç∑Ç∑ÇflǵNjÇπÇÒÅBǵǩǵÉAÉbÉvÉãÇ≈ÇÕÅAÉTÉ|Å[ÉgÇ∑ÇÈï˚ñ@Çï∂èëâªÇµÇƒÇ®Ç©Ç»Ç¢ÇΔÅAÉnÉbÉLÉìÉOÇ…ÇÊÇÈï˚ñ@Ç™â°çsǵÅAç°å„å›ä∑ê´Ç…ñ‚ëËÇ™î≠ê∂Ç∑ÇÈÇΔçlǶÅADZÇà TECHNOTE ÇçÏê¨ÇµÇ‹ÇµÇΩÅB

ÉvÉçÉOÉâÉÄÇ≈ÉÜÅ[ÉUÇà DTP (ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^) ÇçÏê¨ÇµÇΩèÍçáÇÕïKÇ∏ÉÜÅ[ÉUÇ™ê›íËǵǃǢÇΩ DTP Ç…ñflǵÅAëºÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉvÉäÉìÉ^ëIëèÛë‘ÇñWÇ∞ǻǢÇÊǧDžǵǃÇ≠ÇæÇ≥Ç¢ÅB

Å@


äTóv

1994 îNÅAÉAÉbÉvÉãÇÕ StyleWriter 1200 ÉhÉâÉCÉoÇΔ LaserWriter 8.3 ÉhÉâÉCÉoÇ≈ÅAÉfÉXÉNÉgÉbÉvÉvÉäÉìÉeÉBÉìÉOÇì±ì¸ÇµÇ‹ÇµÇΩÅBDZÇÍà»óàÅAëΩÇ≠ÇÃÉfÉxÉçÉbÉpÇ™ Worldwide Developer Technical Support Ç…ÅAÉÜÅ[ÉUÇ…ÉZÉåÉNÉ^ÇégÇÌÇπǻǢÇ≈ÅAÉvÉçÉOÉâÉÄÇÃìÆçÏíÜÇ…ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇçÏê¨Ç∑ÇÈï˚ñ@Çñ‚Ç¢çáÇÌÇπǃǴNjǵÇΩÅBLaserWriter 8.5.1 ÇÃÉäÉäÅ[ÉXÇ≈ÅAÉAÉbÉvÉãÇÕÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÉÜÅ[ÉeÉBÉäÉeÉBÇΔǢǧÉAÉvÉäÉPÅ[ÉVÉáÉìÇì±ì¸ÇµÅAÉÜÅ[ÉUÇ™ÉZÉåÉNÉ^ÇégÇÌǻǢÇ≈ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇçÏê¨Ç≈Ç´ÇÈÇÊǧDžǵNjǵÇΩÅB

SettingsLib ÇÕ PrintingLib ÉtÉ@ÉCÉãÇ…ä‹Ç‹ÇÍÇÈÉRÅ[ÉhÉtÉâÉOÉÅÉìÉgÇ≈Ç∑ÅBSettingsLib ÇÕÅAPrintingLib ì‡ÇÃëºÇÃÉRÅ[ÉhÉtÉâÉOÉÅÉìÉgÇΔ LaserWriter 8 Ç™ÅAï€ë∂Ç≥ÇÍÇΩÉvÉäÉìÉ^èÓïÒÇ…ÉAÉNÉZÉXÇ∑ÇÈÇΩÇflÇ…égópǵNjÇ∑ÅBSettingsLib API Ç…ÉAÉNÉZÉXÇ∑ÇÈÇΩÇflÇ…ÇÕÅAPrintingLib ÇΔÉäÉìÉNÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB

ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉeÉBÉìÉOÇΔÇÕ

ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉeÉBÉìÉOÇΔÇÕÅAÉhÉLÉÖÉÅÉìÉgÇÉÜÅ[ÉUÇÃÉfÉXÉNÉgÉbÉvè„ÇÃÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÃÉAÉCÉRÉìÇ…ÉhÉâÉbÉOÅïÉhÉçÉbÉvǵǃÉvÉäÉìÉgÇ∑ÇÈÉÅÉJÉjÉYÉÄÇ≈Ç∑ÅBÉTÉ|Å[ÉgǵǃǢÇÈÇÃÇÕÅAMac OS 8.x (ëgÇ›çûÇ›ÉTÉ|Å[Ég) ÇΔ System 7.x (ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇÉCÉìÉXÉgÅ[Éã) Ç≈Ç∑ÅBÉÜÅ[ÉUÇ™ÉZÉåÉNÉ^ÇégǡǃêVǵǢÉvÉäÉìÉ^ÇëIÇ‘ÇΔïKÇ∏ÅAêVÇΩÇ…ëIëÇ≥ÇÍÇΩÉfÉtÉHÉãÉgÉvÉäÉìÉ^Çï\Ç∑ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ (DTP) Ç™çÏê¨Ç≥ÇÍÇ‹Ç∑ÅBDZÇÍÇ™äÆóπÇ∑ÇÍÇŒÅAÉhÉLÉÖÉÅÉìÉgÇ DTP è„Ç…ÉhÉâÉbÉOÅïÉhÉçÉbÉvÇ∑ÇÈÇæÇØÇ≈ÅAÉvÉäÉìÉgÉWÉáÉuÇäJénÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB

ÉfÉxÉçÉbÉpÇÕé©ï™Ç≈ÉvÉçÉOÉâÉÄÇèëǢǃ (ÉZÉåÉNÉ^Ç‚ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÉÜÅ[ÉeÉBÉäÉeÉBÇÃÇÊǧDž) àŸÇ»ÇÈÉ^ÉCÉvÇÃÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇçÏê¨Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBÉvÉçÉOÉâÉÄÇ™ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇçÏê¨ÇµÇƒÇµÇ‹Ç¶ÇŒÅAÉIÉyÉåÅ[ÉeÉBÉìÉOÉVÉXÉeÉÄ (ì¡Ç…ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£Åh) ÇÕǪÇÍÇÉZÉåÉNÉ^Ç™çÏê¨ÇµÇΩLJÇÃÇΔìØìôÇ…àµÇ¢Ç‹Ç∑ÅB

äeÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÕì¡íËÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇΔä÷òAïtÇØÇÁÇÍǃǢNjÇ∑ÅBÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÕåªç›ÅAStyleWriter ópÇΔ LaserWriter ópÇçÏê¨Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBMac OS ÇÃè´óàÇÃÉoÅ[ÉWÉáÉìÇ≈ÇÕÅAÉTÅ[ÉhÉpÅ[ÉeÉBÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÉfÉxÉçÉbÉpÇ™ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉeÉBÉìÉOÇóòópÇ≈Ç´ÇÈÇÊǧDžÇ∑ÇÈó\íËÇ≈Ç∑ÅB

îwåi

ÉZÉåÉNÉ^ÇÃÉRÉìÉgÉçÅ[ÉãÉpÉlÉãÇ≈ÉÜÅ[ÉUÇ™ÉvÉäÉìÉ^ÇëIëÇ∑ÇÈÇΔÅAǪÇÃÉvÉäÉìÉ^Ç™ÉVÉXÉeÉÄëSëÃÇÃÉfÉtÉHÉãÉgÉvÉäÉìÉ^ÉhÉâÉCÉoÇ…Ç»ÇËÇ‹Ç∑ÅBëIëǵÇΩÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉtÉ@ÉCÉãÉXÉyÉbÉNÇΔÉtÉ@ÉCÉãñºÇÕÅgSystemÅhÉtÉ@ÉCÉãÇ…ãLò^Ç≥ÇÍÇ‹Ç∑ÅBì¡Ç…ÅAëIëǵÇΩÉvÉäÉìÉ^ÉhÉâÉCÉoÇà AliasRecord Ç™ÅAÉäÉ\Å[ÉXÉ^ÉCÉv 'alis'ÅAID -8192 ÇΔǵǃï€ë∂Ç≥ÇÍÇ‹Ç∑ÅBÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃñºëOÇÕÉäÉ\Å[ÉXÉ^ÉCÉv 'STR 'ÅAID -8192 ÇΔǵǃï€ë∂Ç≥ÇÍÇ‹Ç∑ÅB

ëIëÇ≥ÇÍÇΩÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉ^ÉCÉvÇ™ LaserWriter ÇæÇΔÅAëŒè€ÇÃÉvÉäÉìÉ^ÇéØï Ç∑ÇÈÇΩÇflDžLJǧǖÇΔǬÇÃèÓïÒÇ™ïKóvÇ≈Ç∑ÅBDZÇÃèÓïÒÇÕÉvÉäÉìÉ^ÉhÉâÉCÉoì‡Ç…ÉäÉ\Å[ÉXÉ^ÉCÉv 'PAPA'ÅAID -8192 ÇΔǵǃï€ë∂Ç≥ÇÍǃǢNjÇ∑ÅBÉZÉåÉNÉ^Ç≈ AppleTalk ÉlÉbÉgÉèÅ[ÉNè„ÇÃï ÇÃï®óùÉvÉäÉìÉ^Ç™ëIëÇ≥ÇÍÇÈÇΔïKÇ∏ÅAïœçXÇîΩâfÇ∑ÇÈÇΩÇfl 'PAPA' ÉäÉ\Å[ÉXÇ™çXêVÇ≥ÇÍÇ‹Ç∑ÅB

ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ…ÇÕÇΩÇ≠Ç≥ÇÒÇÃñäÑǙdžÇËÇ‹Ç∑Ç™ÅAǪÇÃÇ–ÇΔǬÇÕè„Ç…ãLç⁄ǵÇΩÉäÉ\Å[ÉXÇÃïœçXÇäƒéãÇ∑ÇÈDZÇΔÇ≈Ç∑ÅBêVǵÇ≠ëIëÇ≥ÇÍÇΩÉfÉtÉHÉãÉgÉvÉäÉìÉ^Çï\Ç∑ÉäÉ\Å[ÉXÇ™ïœçXÇ≥ÇÍÅAǪÇÍÇ…ëŒâûÇ∑ÇÈÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ǙǻǢÇΔÅAÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇÕÅAé©ìÆìIDžǪÇÃÉvÉäÉìÉ^Çï\Ç∑êVǵǢÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇçÏê¨ÇµÇ‹Ç∑ÅB

ǵÇΩǙǡǃÅAÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇçÏê¨Ç∑ÇÈÇΩÇflÇ…ïKóvÇ»çÏãΔÇÕÅAè„Çà 3 ǬÇÃÉäÉ\Å[ÉXÇïœçXÇ∑ÇÈDZÇΔÇæÇØÇ≈Ç∑ÅB

åxçê: ÅgSystemÅhÉtÉ@ÉCÉãÇÃÉäÉ\Å[ÉX 'STR ' -8192 ÇÃì‡óeÇΔ LaserWriter ÉhÉâÉCÉoÇà 'PAPA' ÇïœçXÇ∑ÇÈç€ÅAí∑Ç≥ÇÕïœçXǵǃÇÕÇ¢ÇØÇ‹ÇπÇÒÅBïœçXǵǃǵNjǧÇΔñ‚ëËÇ™ãNDZÇËÇ‹Ç∑ (ÅuTechnote 1115: ägí£ 'PAPA' ÉäÉ\Å[ÉXÅvÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢)ÅB

íçà”: à»â∫ÇÃÉTÉìÉvÉãÉRÅ[ÉhÇ≈ÇÕ Metrowerks PowerPlant ÉNÉâÉXǙǢÇ≠ǬǩégópÇ≥ÇÍǃǢNjÇ∑ÅBDZÇÍDžǬǢǃÇÕ Metrowerks PowerPlant ÇÃÉhÉLÉÖÉÅÉìÉgÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅBÉTÉìÉvÉãÉRÅ[ÉhÇ≈ÇÕ C Ç®ÇÊÇ— C++ÇÃóºï˚ÇÃÉRÅ[ÉfÉBÉìÉOÉXÉ^ÉCÉãÇ™égÇÌÇÍǃǢNjÇ∑ÅBÉTÉìÉvÉãÉRÅ[ÉhÇÕdžÇ≠Ç‹Ç≈ê‡ñæÇÃÇΩÇflÇÃLJÇÃÇ≈Ç∑ÅB

Å@

ä¬ã´ÇÃÉ`ÉFÉbÉN

ÉvÉçÉOÉâÉÄÇÃé¿çsíÜÇ…ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇçÏê¨Ç∑ÇÈèÍçáÇÕÅAǪÇÃëOÇ…í èÌÇÃä¬ã´É`ÉFÉbÉNÇ…â¡Ç¶ÇƒÅAéüÇÃÉ`ÉFÉbÉNÇçsǡǃÇ≠ÇæÇ≥Ç¢ÅB

ÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£

ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇÕÇ«ÇÃÇÊǧǻÉfÉXÉNÉgÉbÉvÉvÉäÉìÉeÉBÉìÉODžLJïKóvÇ≈Ç∑ÅBSystem 8.0 à»ç~ÅADZÇÃã@î\ÇÕ OS Ç…ëgÇ›çûÇ‹ÇÍǃǢNjÇ∑ÅBǵǩǵÅASystem 7.x ÇÃèÍçáÅADZÇÍÇÕÉAÉhÉIÉìÇÃã@î\ägí£Ç≈ÅAÅgã@î\ägí£ÅhÉtÉHÉãÉ_Ç…ì¸Ç¡ÇƒÇ¢Ç‹Ç∑ÅBÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhǙdžÇÈǩǫǧǩÇÉ`ÉFÉbÉNÇ∑ÇÈÉRÅ[ÉhÇÕéüÇÃí ÇËÇ≈Ç∑ÅB

Å@

// ------------------------------------------------------
// ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇÃÉ`ÉFÉbÉN
// ------------------------------------------------------
enum { kGestaltPFEFeatures = 'dtpf' };
Boolean HasDesktopExtension()
{
 OSErr err;
 Boolean hasIt = false;
 long gestaltResponse = NULL;
Å@
 err = Gestalt(kGestaltPFEFeatures, &gestaltResponse);
 if(err == noErr)
  hasIt = true;
 return hasIt;
}

Finder ÉXÉNÉäÉvÉeÉBÉìÉOã@î\ägí£

ÉvÉäÉìÉ^ÉhÉâÉCÉoÇΔÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£Åhä‘ÇÃí êMÇ…ÇÕÉAÉbÉvÉãÉCÉxÉìÉgÇ™égópÇ≥ÇÍÇ‹Ç∑ÅBǪÇÃÇΩÇflÅAÅgFinder ÉXÉNÉäÉvÉeÉBÉìÉOã@î\ägí£ÅhÇ™ÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍǃǢÇÈDZÇΔÇämîFÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB

Å@

// ------------------------------------------------------
// ÅgFinder ÉXÉNÉäÉvÉeÉBÉìÉOã@î\ägí£ÅhÇÃÉ`ÉFÉbÉN
// ------------------------------------------------------
Boolean HasFinderScripting()
{
long gestaltResponse = NULL;
return ( (Gestalt(gestaltFinderAttr, &gestaltResponse ) == noErr)
&& ((response & (1L << gestaltOSLCompliantFinder)) != 0) );
}

óLå¯Ç»ÉvÉäÉìÉ^ÉhÉâÉCÉo

äeÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^Ç…ÇÕóLå¯Ç»ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ™ÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍÇƒÇ¢Ç»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇçÏê¨ÇµÇΩÇ¢ÉvÉäÉìÉ^ÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇ™ÉVÉXÉeÉÄÇ…ÉCÉìÉXÉgÅ[ÉãÇ≥ÇÍǃǢÇÈDZÇΔÇämîFÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBéüÇ…ämîFÇ∑ÇÈÇΩÇflÇÃÉRÅ[ÉhÇé¶ÇµÇ‹Ç∑ÅBÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉtÉ@ÉCÉãÉ^ÉCÉvÇΔÉNÉäÉGÅ[É^ÉRÅ[ÉhÇÕéüÇÃÇΔÇ®ÇËÇæÇΔǵNjÇ∑ÅB

ÉtÉ@ÉCÉã

É^ÉCÉv

ÉNÉäÉGÅ[É^

LaserWriter 8

'PRER'

'vgrd'

StyleWriter 1200

'PRER'

'dblo'

StyleWriter 2500

'PRER'

'auro'

// --------------------------------------------------------------
// ÅgÉVÉXÉeÉÄã@î\ägí£ÅhÉtÉHÉãÉ_ì‡Ç≈éwíËÇ≥ÇÍÇΩç≈è¨ÉoÅ[ÉWÉáÉìÅAÉ^ÉCÉvÅA
// ÉNÉäÉGÅ[É^ÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇå©Ç¬ÇØÇ‹Ç∑ÅB
// íçà”: DZÇÃÉãÅ[É`ÉìÇÕÉGÉâÅ[ÉRÅ[ÉhÇï‘ǵNjÇπÇÒÅBÉGÉâÅ[Ç™ãNDZǡÇΩèÍçáÅA
// åƒÇ—èoǵë§Ç… C++ó·äOÇ™ï‘Ç≥ÇÍÇ‹Ç∑ÅB
// åƒÇ—èoǵë§ÇÕ eofErr Çä‹ÇfiÉGÉâÅ[ÇèàóùÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB
// eofErr ÇÕÉvÉäÉìÉ^ÉhÉâÉCÉoÇ™å©Ç¬Ç©ÇÁǻǩǡÇΩDZÇΔÇé¶ÇµÇ‹Ç∑ÅB
// ÉpÉâÉÅÅ[É^ÇÕéüÇÃí ÇËÇ≈Ç∑ÅB
// inMinVersion - ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃç≈è¨ÉoÅ[ÉWÉáÉìÇéwíË
// inFileType - ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉtÉ@ÉCÉãÉ^ÉCÉvÇéwíË
// inCreator - ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉNÉäÉGÅ[É^ÇéwíË
// outPrinterDrvrFsSpec - ÉvÉäÉìÉ^ÉhÉâÉCÉoÇà FSSpec Ç™å©Ç¬Ç©Ç¡ÇΩèÍçáÅA
// ǪÇÍÇï‘Ç∑
// --------------------------------------------------------------
void FindPrinterDriver(unsigned short inMinVersion, OSType inFileType, OSType inCreator
		void FSSpec& outPrinterDrvrFsSpec )
{
	OSErr err;
	const long kSearchBufSize = 16 * 1024;
	short savedResFile = CurResFile();
	short startupVRefNum;
	long extDirID; // ägí£ã@î\ÉtÉHÉãÉ_ÇÃID
	CInfoPBRec targetPb;
	CInfoPBRec maskPb;
	CSParam catSearchPb;
	FSSpec foundFsSpec;
	StPointerBlock searchBuf(kSearchBufSize); // PBCatSearch ÇÃÉoÉbÉtÉ@
	Boolean foundOne = false;
	Å@
	err = FindFolder(-1, kExtensionFolderType, FALSE, &startupVRefNum, &extDirID);
	ThrowIfOSErr_(err);
	Å@
	targetPb.hFileInfo.ioFlFndrInfo.fdType = inFileType;
	targetPb.hFileInfo.ioFlFndrInfo.fdCreator = inCreator;
	targetPb.hFileInfo.ioNamePtr = 0;
	targetPb.hFileInfo.ioFlAttrib = 0x00; // ÉtÉ@ÉCÉãÇÃÇ›åüçı
	targetPb.hFileInfo.ioFlParID = extDirID; // ã@î\ägí£ÉtÉHÉãÉ_ÇÃÇ›
	Å@
	maskPb.hFileInfo.ioFlFndrInfo.fdType = 0xFFFFFFFF;
	maskPb.hFileInfo.ioFlFndrInfo.fdCreator = 0xFFFFFFFF;
	maskPb.hFileInfo.ioFlFndrInfo.fdFlags = 0;
	maskPb.hFileInfo.ioFlFndrInfo.fdLocation.h = 0;
	maskPb.hFileInfo.ioFlFndrInfo.fdLocation.v = 0;
	maskPb.hFileInfo.ioFlFndrInfo.fdFldr = 0;
	maskPb.hFileInfo.ioNamePtr = 0;
	maskPb.hFileInfo.ioFlAttrib = 0x10; // ÉfÉBÉåÉNÉgÉäÉrÉbÉg
	maskPb.hFileInfo.ioFlParID = extDirID; // ã@î\ägí£ÉtÉHÉãÉ_ÇÃÇ›
	Å@
	Try_{
		catSearchPb.ioCatPosition.initialize = 0;
		while(!foundOne ){
			catSearchPb.ioCompletion = 0;
			catSearchPb.ioNamePtr = 0;
			catSearchPb.ioVRefNum = startupVRefNum;
			catSearchPb.ioMatchPtr = &foundFsSpec;
			catSearchPb.ioReqMatchCount = 1;
			catSearchPb.ioSearchBits = fsSBFlAttrib +
			fsSBFlFndrInfo + fsSBFlParID;
			catSearchPb.ioSearchInfo1 = &targetPb;
			catSearchPb.ioSearchInfo2 = &maskPb;
			catSearchPb.ioSearchTime = 0;
			catSearchPb.ioOptBuffer = (Ptr)searchBuf;
			catSearchPb.ioOptBufSize = kSearchBufSize;
			err = PBCatSearchSync(&catSearchPb);
			ThrowIfOSErr_(err);
			Å@
			// éwíËÇÃÉ^ÉCÉvÇÃÉNÉäÉGÅ[É^ÇéùǬLJÇÃÇ™å©Ç¬Ç©Ç¡ÇΩ
			LFile thePrDrFile(foundFsSpec);
			Try_{
				thePrDrFile.OpenResourceFork(fsRdPerm);
				// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉoÅ[ÉWÉáÉì
				StResource versRsrc('vers', 1, true, true);
				// ç≈è¨ÉoÅ[ÉWÉáÉìÇΔî‰är
				if(**(unsigned short **)(Handle)versRsrc >= inMinVersion){
					// ÉoÅ[ÉWÉáÉìÇÃèåèÇÕçáív
					outPrinterDrvrFsSpec = foundFsSpec;
					foundOne = true; // ÉãÅ[ÉvÇî≤ÇØÇÈ
				}
				thePrDrFile.CloseResourceFork();
			}Catch_(inErr){
				thePrDrFile.CloseResourceFork();
				// throw ǵǻǢ
			}EndCatch_
		} // while
	}Catch_(inErr){
		// ÉfÉtÉHÉãÉgÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ…ñflÇ∑
		UseResFile(savedResFile);
		Throw_(inErr);
	}EndCatch_
}
Å@

Å@

ÉAÉbÉvÉãÉvÉäÉìÉ^ópÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÃçÏê¨

StyleWriter

DZÇÃÉZÉNÉVÉáÉìÇ≈ÇÕÅALaserWriter à»äOÇÃÉvÉäÉìÉ^É^ÉCÉvÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÅAó·Ç¶ÇŒÅAStyleWriter ÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoópÇà DTP ÇçÏê¨Ç∑ÇÈï˚ñ@Çè–âÓǵNjÇ∑ÅB

// ---------------------------------------------------------------------------
// SetResource
// DZÇÃÉãÅ[É`ÉìÇÕä˘ë∂ÇÃÉäÉ\Å[ÉXÇÃì‡óeÇÅAinNewContentH Ç™éwÇ∑êVǵǢ
// ì‡óeÇ…ïœçXǵNjÇ∑ÅBDZÇÃÉãÅ[É`ÉìÇ™åƒÇ—èoÇ≥ÇÍÇÈëOÇ…ÅAÉ^Å[ÉQÉbÉgÇÃ
// ÉäÉ\Å[ÉXÇÃì¸Ç¡ÇΩÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇäJǢǃÅAåªç›ÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ…
// ê›íËÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB
// ---------------------------------------------------------------------------
void
SetResource(ResType inResType, ResID inResID, Handle inNewContentH)
{
	// ïœçXÇ∑ÇÈÉäÉ\Å[ÉXÇéÊÇËèoÇ∑
	oldResH = Get1Resource(inResType, inResID);
	// ÉäÉ\Å[ÉXǙǻǢèÍçá (oldResH == 0) ÇÕÉGÉâÅ[èàóùÇÇ∑ÇÈDZÇΔ
	Å@
	char savedInHdlState = HGetState(inNewContentH);
	char savedRsrcHdlState = HGetState(oldResH );
	Size sz = GetHandleSize(inNewContentH);
	Å@
	HUnlock(oldResH );
	SetHandleSize(oldResH, sz); // ÉTÉCÉYÇçáÇÌÇπÇÈ
	ThrowIfMemError_();
	HLock(oldResH );
	HLock(inNewContentH);
	BlockMove(*inNewContentH, *oldResH, sz); // ì‡óeÇÉRÉsÅ[
	Å@
	HSetState(inNewContentH, savedInHdlState);
	HSetState(oldResH , savedRsrcHdlState);
	ChangedResource(oldResH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑
	WriteResource(oldResH);
	ThrowIfResError_();
	UpdateResFile(CurResFile());
}
// ---------------------------------------------------------------------------
// SetStrResource
// DZÇÃÉãÅ[É`ÉìÇÕä˘ë∂Çà 'STR ' ÉäÉ\Å[ÉXÇÃì‡óeÇ inStrP Ç™éwÇ∑ÅAêVǵǢì‡óeÇ…
// ïœçXǵNjÇ∑ÅBÉ^Å[ÉQÉbÉgÇÃÉäÉ\Å[ÉXÇ™ì¸Ç¡ÇƒÇ¢ÇÈÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇÅADZÇÃ
// ÉãÅ[É`ÉìÇ™åƒÇ—èoÇ≥ÇÍÇÈëOÇ…äJǢǃÅAåªç›ÇÃÉäÉ\Å[ÉXÉtÉ@ÉCÉãÇ…ê›íËÇµÇ»ÇØ
// ÇÍnjǻÇËÇ‹ÇπÇÒÅBä˘ë∂ÇÃÉäÉ\Å[ÉXÇ™è¨Ç≥Ç≠Ç»ÇÈÇÃÇñhÇÆï˚ñ@Ç…ì¡Ç…íçà”ǵǃ
// å©ÇƒÇ≠ÇæÇ≥Ç¢ÅB
// ---------------------------------------------------------------------------
void
SetStrResource(ResType inResType, ResID inResID, ConstStringPtr inStrP )
{
	// ïœçXÇ∑ÇÈÉäÉ\Å[ÉXÇéÊÇËèoÇ∑
	oldResH = Get1Resource(inResType, inResID);
	// ÉäÉ\Å[ÉXǙǻǢèÍçá (oldResH == 0) ÇÕÉGÉâÅ[èàóùÇÇ∑ÇÈDZÇΔ
	Å@
	Size sz = *inStrP + 1;
	/* ï∂éöóÒÇ™ÉnÉìÉhÉãÇÊÇËí∑ÇØÇÍÇŒÅAÉnÉìÉhÉãÇëÂÇ´Ç≠Ç∑ÇÈ */
	if(sz > GetHandleSize(oldResH )){
		char savedRsrcHdlState = HGetState(oldResH );
		HUnlock(oldResH );
		SetHandleSize(oldResH , sz);
		ThrowIfMemError_();
		HSetState(oldResH , savedRsrcHdlState);
	}
	BlockMoveData(inStrP, *oldResH , sz);
	ChangedResource(oldResH );
	WriteResource(oldResH);
	ThrowIfResError_();
	UpdateResFile(CurResFile());
}

ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇÕÅgFinder ã@î\ägí£ÅhÇΔǵǃé¿ëïÇ≥ÇÍǃǢÇÈÇΩÇflÅAí êMÇçsǧÇΩÇflÇ…ÇÕ Finder Ç…àÀóäÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBéüÇÃÉãÅ[É`ÉìÇÕDZÇÃñ⁄ìIÇíBê¨Ç∑ÇÈÇΩÇflÇ…ïKóvǻLJÇÃÇ≈Ç∑ÅB

// ---------------------------------------------------------------------------
// ÉAÉbÉvÉãÉCÉxÉìÉgÇëóÇËÇΩÇ¢ Finder ÇÃÉAÉhÉåÉXÇçÏê¨ÇµÇ‹Ç∑ÅB
// DZDZÇ≈ÇÃÅuFinderÅvÇÕç≈LJàÍî ìIÇ»à”ñ°Ç≈égǡǃǢÇÈDZÇΔÇ…íçà”ǵǃÇ≠ÇæÇ≥Ç¢ÅB
// é¿ç€Ç…ÇÕÅAFinder ÇΔ AtEase Çà”ñ°ÇµÇ‹Ç∑ÅB
// ---------------------------------------------------------------------------
OSStatus getFinderAddress(AEAddressDesc *theDesc)
{
	OSErr result = noErr;
	ProcessInfoRec processInfo;
	ProcessSerialNumber serialNumber;
	Å@
	serialNumber.highLongOfPSN = 0;
	serialNumber.lowLongOfPSN = kNoProcess;
	while ((result = GetNextProcess(&serialNumber)) == noErr)
	{
		processInfo.processInfoLength = sizeof(ProcessInfoRec);
		processInfo.processName = nil;
		processInfo.processAppSpec = nil;
		Å@
		result = GetProcessInformation(&serialNumber, &processInfo);
		if (result == noErr){
			if ( processInfo.processType == 'FNDR' ){
				result = AECreateDesc(typeProcessSerialNumber, (Ptr)&serialNumber,
				sizeof(ProcessSerialNumber), theDesc);
				return(result);
			}
		}
	}
	return(result);
}
Å@
// ---------------------------------------------------------------------------
// ÉAÉbÉvÉãÉCÉxÉìÉgÇ Finder Ç…ëóÇËÇ‹Ç∑ÅBÉCÉxÉìÉgÉfÅ[É^ÇÕ 'dataPtr' Ç™éwǵÅA
// ǪÇÃí∑Ç≥ÇÕ 'dataSize' ÉoÉCÉgÇ≈Ç∑ÅBÉfÅ[É^ÇÕ Finder Ç™ì‡óeÇâéflÇ≈Ç´ÇÈÇÊǧ
// ÉfÅ[É^Ç…ÇÕÉTÉuÉ^ÉCÉvÇó^ǶNjÇ∑ÅB
// ---------------------------------------------------------------------------
#define kFinderExtension 'fext'
static OSStatus sendAEToFinder( Ptr dataPtr, Size dataSize)
{
	OSStatus err = noErr;
	// ÉAÉbÉvÉãÉCÉxÉìÉgÉfÉXÉNÉäÉvÉ^Ç… Finder ÇÃÉAÉhÉåÉXÇéwíË
	AEAddressDesc finderAddr;
	AppleEvent theEvent;
	AppleEvent replyEvent;
	Å@
	err = getFinderAddress(&finderAddr);
	if (err == noErr) {
		err = AECreateAppleEvent(
			kCoreEventClass, // ÉRÉAÉCÉxÉìÉgÇçÏê¨
			kFinderExtension, // Finder ã@î\ägí£ÇÃÉCÉxÉìÉg
			&finderAddr, // DZÇÍÇ Finder Ç…ëóÇÈ
			kAutoGenerateReturnID, // ï‘ÇËílÇÕéÊìæÇµÇ»Ç¢
			kAnyTransactionID, // ÉgÉâÉìÉUÉNÉVÉáÉìî‘çÜÇÕñ≥éã
			&theEvent); // DZDZDžÇ∑ÇÆçÏê¨
		if (err == noErr)
		{
			err = AEPutParamPtr(
				&theEvent, // ìnÇ∑ÉCÉxÉìÉg
				keyDirectObject, // É_ÉCÉåÉNÉgÉIÉuÉWÉFÉNÉgÉLÅ[ÉèÅ[Éh
				kFinderExtension, // Finder ägí£ã@î\Ç…ëóÇÈ
				dataPtr, // DZÇÍÇ™ÉfÅ[É^
				dataSize); // DZÇÍǙǪÇÃí∑Ç≥
		Å@
			if (err == noErr)
			{
				err = AESend(
					&theEvent, // ÉXÉeÅ[É^ÉXÉCÉxÉìÉgÇëóÇÈ
					&replyEvent, // ÉäÉvÉâÉCÉCÉxÉìÉgÇÕǻǵÅAÇ»Ç∫Ç»ÇÁ...
					kAENoReply + // ÉäÉvÉâÉCÇÕïsóvÅA
					kAECanInteract + // éÛêMé“ÇÕÉÜÅ[ÉUÇΔëŒòbâ¬î\Ç≈ÅA
					kAEDontReconnect, // ÉGÉâÅ[Ç™î≠ê∂ǵǃLJçƒê⁄ë±ÇµÇ»Ç¢Ç©ÇÁÅB
					kAENormalPriority, // í èÌÉCÉxÉìÉg
					kAEDefaultTimeout, // àÍíËéûä‘ë“Ǭ
					nil, nil); // ìÆçÏÇÃåãâ ÇÕñ≥éã
			}
			Å@
			// DZDZÇ≈ÉAÉbÉvÉãÉCÉxÉìÉgÇâï˙
			(void) AEDisposeDesc(&theEvent);
		}
	Å@
		// DZDZÇ≈ Finder ÉAÉhÉåÉXÇâï˙
		(void) AEDisposeDesc(&finderAddr);
	}
	Å@
	// DZDZNjÇ≈óàÇÈÅBÉGÉâÅ[Ç (džÇÍÇŒ) ï‘Ç∑ÅB
	return(err);
}

ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇÕêVǵÇ≠ëIëÇ≥ÇÍÇΩåªç›ÇÃÉvÉäÉìÉ^Çé©ìÆìIÇ…åüèoÇ≈Ç´Ç‹Ç∑Ç™ÅADZÇÍÇÕãÛÇ´éûä‘Ç…ä÷òAÉäÉ\Å[ÉXÇÉ`ÉFÉbÉNÇ∑ÇÈDZÇΔÇ…ÇÊǡǃçsǢNjÇ∑ÅBDZÇÍÇ…é·ä±ÇÃéûä‘ǙǩǩÇÈèÍçáǙdžÇËÇ‹Ç∑ÅBåüèoÇ‹Ç≈ÇÃéûä‘ÇíZèkÇ∑ÇÈÇ…ÇÕÅAéüÇÃÉãÅ[É`ÉìÇ≈ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ…ÉAÉbÉvÉãÉCÉxÉìÉgÇëóÇËÅAêVǵǢÉvÉäÉìÉ^ÇÃí«â¡Ç™Ç†Ç¡ÇΩDZÇΔÇí ímÇ∑ÇÈÇΔÇÊÇ¢Ç≈ǵÇÂǧÅB

// ---------------------------------------------------------------------------
// nessieCreateDTP
// ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ…ÉAÉbÉvÉãÉCÉxÉìÉgÇëóÇËÅA
// åªç›ÇÃÉvÉäÉìÉ^Ç…ëŒâûÇ∑ÇÈêVǵǢ DTP ÇÃçÏê¨ÇàÀóäǵNjÇ∑ÅB
// ---------------------------------------------------------------------------
#define kPrintingExtension 'dtpx'
#define aePFECreateDTP 'pfcr'
typedef struct
{
	OSType pfeCreator;
	OSType extensionType;
} CreateDTPEvent;
Å@
// ---------------------------------------------------------------------------
// ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÅ^Finder Ç…åªç›ÇÃÉvÉäÉìÉ^Ç™ïœçXÇ…
// ǻǡÇΩDZÇΔÇí ímǵNjÇ∑
// ---------------------------------------------------------------------------
OSStatus nessieCreateDTP()
{
	OSStatus err;
	CreateDTPEvent myEvent;
	Å@
	myEvent.pfeCreator = kPrintingExtension;
	myEvent.extensionType = aePFECreateDTP;
	// ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇÕ Finder ã@î\ägí£Ç≈džÇÈÇΩÇfl
	err = sendAEToFinder((Ptr) &myEvent, sizeof(myEvent));
	return err;
}

åªç›ÇÃÉvÉäÉìÉ^ÇéwíËÇ∑ÇÈÉäÉ\Å[ÉXÇê≥ǵÇ≠ê›íËǵÅAÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ÷ÇÃí ímÇ™çsÇ¡ÇΩå„ÅAÇ≥ÇÁÇ… DTP Ç™é¿ç€Ç…çÏê¨Ç≥ÇÍÇΩǩǫǧǩÇí≤Ç◊Ç»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBDZÇÃÇΩÇflÅADTPInfo ÉfÅ[É^ç\ë¢ëÃÇégópǵNjÇ∑ÅB

typedef struct DTPInfo{
	short vRefNum; // DTP ÉtÉHÉãÉ_Çà vRefNum
	long dirID; // DTP ÉtÉHÉãÉ_ÇÃÉfÉBÉåÉNÉgÉä ID
	Str31 DTPName; // DTP ÉtÉHÉãÉ_ÇÃñºëO
	OSType driverType; // DZÇà DTP ÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉNÉäÉGÅ[É^É^ÉCÉv
	Boolean current; // DZÇà DTP ÇÕåªç›ÉfÉtÉHÉãÉgÉvÉäÉìÉ^ǩǫǧǩ
	Str32 printerName; // ÉlÉbÉgè„ÇÃé¿ç€ÇÃÉvÉäÉìÉ^ñº (LW8.4 ÇÃÇ›)
	Str32 zoneName; // ÉvÉäÉìÉ^ÇÃdžÇÈÉ]Å[Éì (LW8.4 ÇÃÇ›)
} DTPInfo, *DTPInfoPtr, **DTPInfoHdl;

DTP DžǬǢǃÇÃèÓïÒÇéÊìæÇ∑ÇÈï˚ñ@ÇÕÅAÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ÷Çà Gestalt åƒÇ—èoǵÇçsǧDZÇΔÇ≈Ç∑ÅBGestalt åƒÇ—èoǵÇÕ DTPInfo ÇÃÉäÉXÉgÇï‘ǵNjÇ∑ÅBÉäÉXÉgì‡ÇÃäe DTPInfo ÉåÉRÅ[ÉhÇÕǪÇÍǺÇÍ 1 å¬Çà DTP ÇãLèqǵNjÇ∑ÅBÉäÉXÉgÇíHǡǃå¬ÅXÇà DTPInfo ÇÃì‡óeÇí≤Ç◊ÅAäÛñ]Çà DTP Ç™çÏê¨Ç≥ÇÍǃǢÇÈÇ©Çí≤Ç◊ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBéüÇÃÉãÅ[É`ÉìÇÕǪÇÃï˚ñ@Çê‡ñæÇµÇΩLJÇÃÇ≈Ç∑ÅB

#define errDTPNotFound -1
#define kGestaltPFEInfo 'dtpx'
enum
{
  kOldPFEGestaltStructVersion = 0x02008000, // ÉoÅ[ÉWÉáÉì 2.0f0 (Mac OS 8.0ÅA8.1ÅA7.x)
  kPFEGestaltStructVersion = 0x03000000 // ÉoÅ[ÉWÉáÉì 3.0 (Allegro)
};
// GestaltDTPInfo
typedef struct
{
  short vRefNum; // DTP ÉtÉHÉãÉ_Çà vRefNum
  long dirID; // DTP ÉtÉHÉãÉ_ÇÃÉfÉBÉåÉNÉgÉä ID
  Str31 dtpName; // DTP ÉtÉHÉãÉ_
  OSType driverType; // DZÇà DTP ÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉNÉäÉGÅ[É^É^ÉCÉv
  Boolean current; // DZÇà DTP ÇÕåªç›ÉfÉtÉHÉãÉgÉvÉäÉìÉ^Ç©
  Str32 printerName; // ÉlÉbÉgè„ÇÃé¿ç€ÇÃÉvÉäÉìÉ^ÇÃñºëO (LaserWriter 8 DTP ÇÃÇ›)
  Str32 zoneName; // DZÇÃÉvÉäÉìÉ^ÇÃdžÇÈÉ]Å[Éì (LaserWriter 8 DTP ÇÃÇ›)
} GestaltDTPInfo, *GestaltDTPInfoPtr;
// data associated with the pfe gestalt
typedef struct
{
  long version; // kPFEGestaltStructVersion
  short numDTPs; // ÉAÉNÉeÉBÉuÇ» DTP ÇÃå¬êî
  Handle theDTPList; // ÉAÉNÉeÉBÉuÇ» DTP Çà GestaltDTPInfo ÉäÉXÉgÇ÷ÇÃÉnÉìÉhÉã
  Handle theDTPDriverList; // ÉhÉâÉCÉoÇÃÉtÉ@ÉCÉãÉXÉyÉbÉNÇÃÉäÉXÉgÇ÷ÇÃÉnÉìÉhÉã
  Handle theDTPMoreInfoList; // ÉAÉbÉvÉãÇÃì‡ïîégópÇÃÇ›
} GestaltPFEInfo, **GestaltPFEInfoHdl;
Å@
// ---------------------------------------------------------------------------
// DTP ÇÃÉäÉXÉgÇíHÇËÅAÉlÉbÉgÉèÅ[ÉNÉAÉhÉåÉXÇ™ 'papaH'ÅA
// ÉtÉ@ÉCÉãÉXÉyÉbÉNÇ™ *printerDrvrFsSpecP ÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoDždžÇΩÇÈ
// ÉvÉäÉìÉ^ÇãLèqÇ∑ÇÈ DTP ÇíTǵNjÇ∑ÅB
// papaH ÇÕ NULL ÇæÇΔñ≥éãǵNjÇ∑ÅB
// printerDrvrFsSpecP ÇÕ NULL ÇæÇΔñ≥éãǵNjÇ∑ÅB
//
// àÍívÇ∑ÇÈLJÇÃÇ™å©Ç¬Ç©Ç¡ÇΩÇÁÅAnoErr Çï‘ǵNjÇ∑ÅB
// àÍívÇ∑ÇÈLJÇÃÇ™å©Ç¬Ç©ÇÁǻǢèÍçáÇÕÅAÉGÉâÅ[Çï‘ǵNjÇ∑ÅB
// åƒÇ—èoǵë§Ç™àÍívǵÇΩÉvÉäÉìÉ^DžǬǢǃÇÃèÓïÒǙǟǵǢèÍçáÇÕÅA
// *'DTPInfoP' Ç…ÇÕ NULL à»äOÇÃílÅAǬNjÇË DTPInfo ç\ë¢ëÃÇäÑÇËìñǃǃ
// ǪÇÃóÃàÊÇéwÇ∑É|ÉCÉìÉ^ÇìnǵǃÇ≠ÇæÇ≥Ç¢ÅB
// ---------------------------------------------------------------------------
OSStatus
nessieFindDTP(Handle papaH, FSSpec *printerDrvrFsSpecP, DTPInfo *DTPInfoP)
{
  DTPInfoPtr found = NULL;
  GestaltPFEInfoHdl gestaltResponse;
  char papaHState;
  OSStatus err;
  Å@
  if(papaH){
    papaHState = HGetState(papaH);
    HLock(papaH);
  }
  Å@
  err = Gestalt(kGestaltPFEInfo, (long *)&gestaltResponse);
  if(!err && gestaltResponse != NULL){
    int numDTPs = (*gestaltResponse)->numDTPs;
    DTPInfoHdl DTPH = (*gestaltResponse)->theDTPList;
    FSSpec** driverH = (*gestaltResponse)->theDTPDriverList;
    Å@
    err = errDTPNotFound;
    if((numDTPs > 0) && (DTPH != NULL) && (driverH != NULL)){
      DTPInfoPtr DTP;
      FSSpec *driverP;
      char DTPState = HGetState((Handle)DTPH);
      char driverListState = HGetState((Handle)driverH);
      HLock((Handle)DTPH);
      HLock((Handle)driverH);
      DTP = *DTPH;
      driverP = *driverH;
      if((DTP != NULL) && (driverP != NULL)){
        StringPtr printerStr; // ÉvÉäÉìÉ^ñºÇ÷ÇÃÉ|ÉCÉìÉ^
        StringPtr zoneStr; // É]Å[ÉìñºÇ÷ÇÃÉ|ÉCÉìÉ^
        // (ç≈èâÇÕÉIÉuÉWÉFÉNÉgÉ^ÉCÉvÇèúäO)
        int i;
        if(papaH){
          printerStr = (StringPtr)*papaH; // ÉvÉäÉìÉ^ñºÇ÷ÇÃÉ|ÉCÉìÉ^
          zoneStr = printerStr + *printerStr + 1; // É]Å[ÉìñºÇ÷ÇÃÉ|ÉCÉìÉ^
          // (ç≈èâÇÕÉIÉuÉWÉFÉNÉgÉ^ÉCÉvÇèúäO)
          zoneStr += *zoneStr + 1; // É]Å[ÉìñºÇê›íË
        }
      Å@
        for(i = 0; i < numDTPs && found == NULL;
          ++i, ++DTP, ++driverP){
          // íTǵǃǢÇÈ DTP ÇÕÅAéwíËÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇ≈çÏê¨Ç≥ÇÍǃǮÇËÅA
          // É]Å[ÉìñºÇΔÉvÉäÉìÉ^ñºÇ™çáívÇ∑ÇÈLJÇÃ
          if(papaH){
            if(((printerDrvrFsSpecP == NULL) ||
            ((printerDrvrFsSpecP->vRefNum == driverP->vRefNum) &&
            (printerDrvrFsSpecP->parID == driverP->parID) &&
            (EqualString(printerDrvrFsSpecP->name, driverP->name, false, false)))) &&
            Å@
            EqualString(printerStr, DTP->printerName, false, false) &&
            EqualString(zoneStr, DTP->zoneName, false, false)){
              found = DTP;
            }
          }else{
            if((printerDrvrFsSpecP != NULL) &&
            ((printerDrvrFsSpecP->vRefNum == driverP->vRefNum) &&
            Å@
            (printerDrvrFsSpecP->parID == driverP->parID) &&
            (EqualString(printerDrvrFsSpecP->name, driverP->name, false, false)))){
              found = DTP;
            }
          }
        }
        if(found != NULL){
          if(DTPInfoP) *DTPInfoP = *found;
        }
      }
      HSetState((Handle)driverH, driverListState);
      HSetState((Handle)DTPH, DTPState);
    }
  }
  Å@
  if(papaH)
    HSetState(papaH, papaHState);
  Å@
  return found == NULL ? errDTPNotFound : noErr;
}
Å@
// ---------------------------------------------------------------------------
// DZÇÃÉãÅ[É`ÉìÇÕÅAÉvÉäÉìÉ^ÉhÉâÉCÉoÇà FSSpec ÇéÛÇØéÊÇËÅA
// äYìñÇ∑ÇÈ DTP Ç™ë∂ç›Ç∑ÇÈǩǫǧǩÇí≤Ç◊Ç‹Ç∑ÅB
// ---------------------------------------------------------------------------
Boolean HasDTP(DTPInfo *DTPInfoP, FSSpec *prDriverFsSpecP)
{
  OSStatus err;
  Å@
  err = nessieFindDTP(NULL, prDriverFsSpecP, DTPInfoP);
  return(!err);
}

DZÇÍÇ‹Ç≈Ç…è–âÓǵÇΩÉãÅ[É`ÉìÇÃèïÇØÇéÿÇËǃÅADZÇÍÇ©ÇÁç≈èâÇà DTP ÇçÏê¨ÇµÇ‹Ç∑ÅBDZÇÃÉTÉìÉvÉãÇ™é¶Ç∑ÇÃÇÕÅALaserWriter à»äOÇÃÉ^ÉCÉvÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoóp DTP ÇÃçÏê¨ï˚ñ@Ç≈Ç∑ÅBLaserWriter (LW) DTP ÇÃèÍçáÇÕÅALaserWriterExtra() ÇΔǢǧÉãÅ[É`ÉìÇåƒÇ—èoÇ∑ïKóvǙdžÇËÅADZDZÇ≈ÇÕÉRÉÅÉìÉgDžǵǃäOǵǃdžÇËÇ‹Ç∑ÅB(è⁄ç◊DžǬǢǃÇÕÅuLaserWriterÅvÇÃÉZÉNÉVÉáÉìÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB)

ä¬ã´ÇÃämîFå„ÅAÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃèÍèäÇí≤Ç◊Ç‹Ç∑ÅBǪÇÍÇ©ÇÁÅAÅgSystemÅhÉtÉ@ÉCÉãì‡ÇÃåªç›ÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇéwíËÇ∑ÇÈ 2 ǬÇÃÉäÉ\Å[ÉXÇïœçXǵÅAÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhDžǪÇÃïœçXÇí ímǵÅAêVǵǢ DTP Ç™çÏê¨Ç≥ÇÍÇÈÇÃÇë“ÇøÇ‹Ç∑ÅBë“ÇøÉãÅ[ÉvÇ≈ÇÃìÆçÏÇ…íçñ⁄ǵǃÇ≠ÇæÇ≥Ç¢ÅBÉãÅ[Évì‡Ç≈ÇÕÅAEventAvail Ç‹ÇΩÇÕ WaitNextEvent Ç≈ Finder Ç…êßå‰ÇìnÇ∑ïKóvǙdžÇËÇ‹Ç∑ÅBDZÇÍÇǵǻǢÇΔÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÅ^Finder ÇÕ DTP ÇçÏê¨Ç∑ÇÈã@âÔÇéùǬDZÇΔÇ™Ç≈Ç´Ç‹ÇπÇÒÅB

#define kWaitForDTPTime (60 * 20)
// ---------------------------------------------------------------------------
// CreateDTP
// DZÇÃÉãÅ[É`ÉìÇÕ StyleWriter1200 óp DTP ÇÃçÏê¨ï˚ñ@Çé¶ÇµÇ‹Ç∑ÅB
// ---------------------------------------------------------------------------
void
CreateDTP()
{
  OSErr err;
  short savedResFile = CurResFile();
  FSSpec printerDriverFSSpec;
  AliasHandle theAlias;
  EventRecord eventRec;
  unsigned long endTime = TickCount() + kWaitForDTPTime;
  DTPInfo DTPInfo;
  Å@
  // ä¬ã´ÇÃÉ`ÉFÉbÉNÅB
  // ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ®ÇÊÇ—
  // ÅgFinder ÉXÉNÉäÉvÉeÉBÉìÉOã@î\ägí£ÅhǙdžÇÈDZÇΔÇämîF
  if(HasDesktopExtension() && HasFinderScripting()){
    Try_{
      FindPrinterDriver(0x0120,
      'PRER', 'dblo', FSSpec& // StyleWriter1200
      printerDriverFSSpec);
      Å@
      /* LaserWriter É^ÉCÉvÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇà DTP ÇçÏê¨Ç∑ÇÈÇ…ÇÕÅA
      DZDZDžÉRÅ[ÉhÇ™èëÇ≠ïKóvǙdžÇÈÅB
      ǪÇÃèÍçáÇÕéüÇåƒÇ—èoÇ∑ Å® LaserWriterExtra();
      */
      Å@
      UseResFile(0); // ÉVÉXÉeÉÄÉtÉ@ÉCÉã
      // ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉGÉCÉäÉAÉXÇçÏê¨
      err = NewAlias(nil, &printerDriverFSSpec, &theAlias);
      ThrowIfOSErr_(err);
      // åªç›ÇÃÉvÉäÉìÉ^ÇäYìñÇÃÉvÉäÉìÉ^ÉhÉâÉCÉoÇ…ê›íË
      SetResource('alis', -8192, theAlias);
      SetStrResource('STR ', -8192, printerDriverFSSpec.name);
      DisposeHandle(theAlias);
      Å@
      // ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ…ÉfÉtÉHÉãÉg
      // ÉvÉäÉìÉ^ÇÃïœçXÇí ím
      err = nessieCreateDTP();
      // DTP Ç™çÏê¨Ç≥ÇÍÇΩǩǫǧǩämîF
      do{
        // ÅgÉfÉXÉNÉgÉbÉvÅEÉvÉäÉìÉ^ã@î\ägí£ÅhÇ…
        // DTP çÏê¨óvãÅÇèàóùÇ∑ÇÈã@âÔÇó^ǶÇÈ
        EventAvail(everyEvent, &eventRec);
        newDTPMade = HasDTP(&DTPInfo, &printerDriverFSSpec);
      }while((TickCount() < endTime) && (newDTPMade == FALSE));
      // DTP Ç™çÏê¨Ç≥ÇÍÇÈÇ©É^ÉCÉÄÉAÉEÉgÇ∑ÇÈÇ‹Ç≈
    }Catch_(inErr){
      // ÉGÉâÅ[èàóù
    }EndCatch_
  }
  UseResFile(savedResFile);
}
Å@

LaserWriter ópÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÃçÏê¨

LaserWriter ópÇà DTP ÇçÏê¨Ç∑ÇÈÉRÅ[ÉhÇèëÇ≠èÍçáÇÕÅACreateDTP() ÉãÅ[É`ÉìÇ…è≠ǵïœçXÇâ¡Ç¶ÇÈÇæÇØÇ≈ëÂè‰ïvÇ≈Ç∑ÅB

FindPrinterDriver ÇåƒÇ—èoÇ∑ÇΔDZÇÎÇ≈ÅAStyleWriter ópÇÃÉNÉäÉGÅ[É^ÇÃë„ÇÌÇËÇ…ÅALaserWriter ÇÃÉNÉäÉGÅ[É^ÇìnǵNjÇ∑ÅBè„ÇÃÉTÉìÉvÉãÇ≈ÇÕÉRÉÅÉìÉgÇ≈èúäOǵǃdžǡÇΩ LaserWriterExtra() ÉãÅ[É`ÉìLJåƒÇ—èoǵǃÇ≠ÇæÇ≥Ç¢ÅBLaserWriterExtra() ÇÕÅALaserWriter ÉvÉäÉìÉ^ÉhÉâÉCÉoì‡Çà 'PAPA' -8192 ÉäÉ\Å[ÉXÇïœçXǵǃÅAêVǵǢÉvÉäÉìÉ^ÇéwÇ∑ÇÊǧDžǵNjÇ∑ÅB

LaserWriterExtra() ÉãÅ[É`ÉìÇÕÅALaserWriter 8.5.1 ÇΔǪÇÍÇÊÇËëOÇÃÉoÅ[ÉWÉáÉìÇ≈ÇÕàŸÇ»ÇËÇ‹Ç∑ÅB8.5.1 ÇÃèÍçáÇÕ DTP ÇÃÉ^ÉCÉvÇ…ÇÊǡǃÇ≥ÇÁÇ…à·Ç¢Ç™Ç†ÇËÇ‹Ç∑ÅB

Å@

8.5.1 ÇÊÇËëOÇà LaserWriter ópÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÃçÏê¨

8.5.1 ÇÊÇËëOÇà LaserWriter Ç≈ÇÕÅAAppleTalk (PAP) DTP ǵǩçÏê¨Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹ÇπÇÒÅBÉhÉâÉCÉoÇ™ÉIÉäÉWÉiÉãÇà 103 ÉoÉCÉgí∑Çà 'PAPA' ǵǩÉTÉ|Å[ÉgǵǻǢÇΩÇflÇ≈Ç∑ÅBLaserWriterExtra() ÉãÅ[É`ÉìÇÕéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB

Å@

// ---------------------------------------------------------------------------
// 8.5.1 ÇÊÇËëOÇÃ LaserWriter óp LaserWriterExtra
// åªç›ÇÃÉvÉäÉìÉ^ÇÉ^Å[ÉQÉbÉgDžǵNjÇ∑ÅB
// ---------------------------------------------------------------------------
LaserWriterExtra(FSSpec *printerDrvrFsSpecP,
	ConstStr32Param inZone,
	ConstStr32Param inPrinterName)
{
	OSErr err;
	char papaState;
	short refNum;
	Handle papaH;
	short savedResFile = CurResFile();
	Å@
	// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠
	err = FSpOpenResFile(printerDrvrFsSpecP, fsWrPerm);
	// ÉGÉâÅ[èàóù
	Å@
	// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ©ÇÁ PAPA ÉäÉ\Å[ÉXÇéÊìæ
	papaH= Get1Resource('PAPA' , -8192);
	// ÉGÉâÅ[èàóù
	Å@
	papaState = HGetState(papaH);
	HLock(papaH);
	// PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX
	NBPSetEntity(*papaH, (ConstStr32Param)StringPtr(inPrinterName),
	(ConstStr32Param)("\pLaserWriter"),
	(ConstStr32Param)inZone);
	Å@
	HSetState(papaH, papaState );
	ChangedResource(papaH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑
	WriteResource(papaH); // ÉäÉ\Å[ÉXÇçXêV
	err = FSClose(refNum);
	UseResFile(savedResFile);
}

Å@

LaserWriter 8.5.1 à»ç~ÇÃèÍçá

LaserWriter 8.5.1 ÇÕägí£ PAPA (1024 ÉoÉCÉgí∑) ÇÉTÉ|Å[ÉgǵNjÇ∑ÅBägí£ PAPA ÇégǧÇΔÅAÉIÉäÉWÉiÉãÇà AppleTalkÅuPAPÅvÉvÉäÉìÉ^Ç…â¡Ç¶ÇƒÅAàŸÇ»ÇÈÉ^ÉCÉvÇÃâºëzÇ‹ÇΩÇÕï®óùÉvÉäÉìÉ^Çï\Ç∑ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇçÏê¨Ç∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBàŸÇ»ÇÈÉ^ÉCÉvÇà DTP Ç…àÛç¸Ç∑ÇÈÇΔà·Ç§åãâ Çê∂Ç∂Ç‹Ç∑ÅBÅuï€óØÅvDTP ÇÕÉXÉvÅ[ÉãÉtÉ@ÉCÉãÇéÛÇØïtÇØÇÈÇæÇØÇÃÉvÉäÉìÉ^Ç≈Ç∑ÅBÅuPostScript ÉgÉâÉìÉXÉåÅ[É^ÅvDTP ÇÕàÛç¸ï∂èëÇ PostScript ï∂èëÇ…ïœä∑Ç∑ÇÈLJÇÃÇ≈Ç∑ÅBÅuÉJÉXÉ^ÉÄÅvDTP ÇÕÅAdžÇÁÇ©Ç∂ÇfléwíËÇ≥ÇÍÇΩÉAÉvÉäÉPÅ[ÉVÉáÉìÇãNìÆÇµÅAïœä∑çœÇ›Çà PostScript ï∂èëÇäJÇ≠ÇÊǧñΩÇ∂ÇÈLJÇÃÇ≈Ç∑ÅBÅuLPRÅvDTP ÇÕ LPR ÉvÉçÉgÉRÉãÇóùâÇ∑ÇÈÉvÉäÉìÉ^Å^ÉXÉvÅ[ÉâÇ…àÛç¸ÇçsǢNjÇ∑ÅBÅuê‘äOê¸ÅvDTP ÇÕê‘äOê¸í êMÉ|Å[ÉgÇéùǬ LaserWriter Ç…àÛç¸ÇµÇ‹Ç∑ÅBägí£ PAPA ÇÃè⁄ç◊DžǬǢǃÇÕÅuTECHNOTE 1115: ägí£ 'PAPA' ÉäÉ\Å[ÉXÅvÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB

PrintingLib Ç…ÇÕÅAÉvÉçÉOÉâÉ}Ç™ì‡ïîç\ë¢ÇóùâǵǻÇ≠ǃLJägí£ PAPA ÇçÏê¨Ç≈Ç´ÇÈÉãÅ[É`ÉìǙdžÇËÇ‹Ç∑ÅBè⁄ç◊DžǬǢǃÇÕÅuTECHNOTE 1129: ÉvÉäÉìÉ^ê›íËÉâÉCÉuÉâÉäÅvÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB

LaserWriter ÉhÉâÉCÉoÇà PAPA ÉäÉ\Å[ÉXÇïœçXǵǃ DTP ÇçÏê¨Ç∑ÇÈëOÇ…ÅADTP ÇäÆëSÇ…ãLèqÇ∑ÇÈí«â¡ÇÃÉpÉâÉÅÅ[É^Çê›íËÇ∑ÇÈïKóvLJdžÇËÇ‹Ç∑ÅBåªç›íËã`Ç≥ÇÍǃǢÇÈ DTP ópÇÃÉpÉâÉÅÅ[É^ÇÃó·ÇÕÅAÇ∑Ç◊ǃÇÃÉ^ÉCÉvÇà DTP Ç≈ïKóvÇ» PPD ÉtÉ@ÉCÉãÅALPR DTP ÇÃÉhÉÅÉCÉìÉAÉhÉåÉXÅAÉgÉâÉìÉXÉåÅ[É^ DTP ÇÃäiî[êÊÉtÉHÉãÉ_ÅAÉJÉXÉ^ÉÄ DTP ÇÃå„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìǙdžÇËÇ‹Ç∑ÅB

ÉpÉâÉÅÅ[É^ÇÕéüÇÃï\ÇÃí ÇËÇ≈Ç∑ÅB

Collection Tag

Tag ID

DTP Type

parameter

'pppd'

1

Ç∑Ç◊ǃ

âêÕçœÇ› PPD FSSpec

'ppd '

1

Ç∑Ç◊ǃ

í«â¡Çà PPD édól

'LpIa'

1

LPR

ÉvÉäÉìÉ^ÇÃ
ÉhÉÅÉCÉìÉAÉhÉåÉX

'Svap'

1

ÉgÉâÉìÉXÉåÅ[É^

ÅuÉtÉ@ÉCÉãÇ…ï€ë∂Åv
ÇÃê›íË

'Pdka'

1

ÉgÉâÉìÉXÉåÅ[É^

äiî[êÊÉtÉHÉãÉ_ÇÃ
ÉGÉCÉäÉAÉX

'TGap'

1

ÉJÉXÉ^ÉÄ

å„èàóùópÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉGÉCÉäÉAÉX

'PSlv'

1

ÉJÉXÉ^ÉÄ

PostScript ÉåÉxÉã

'BNok'

1

ÉJÉXÉ^ÉÄ

ÉoÉCÉiÉäÉfÅ[É^ÇÃégóp

'JObt'

1

ÉJÉXÉ^ÉÄ

PostScriptÇÃÉ^ÉCÉv

'FOnt'

1

ÉJÉXÉ^ÉÄ

ÉtÉHÉìÉgèàóù

'CsDs'

1

ÉJÉXÉ^ÉÄ

å„èàóùópÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃê‡ñæ

DZÇÍÇÁÇÃÉpÉâÉÅÅ[É^ÇÕÉRÉåÉNÉVÉáÉìì‡Ç…ÉqÉìÉgÇΔǵǃï€ä«Ç≥ÇÍÅAå„Ç… LaserWriter ÇÃê›íËÉtÉ@ÉCÉãÇ…ï€ë∂Ç≥ÇÍÇ‹Ç∑ÅBÉqÉìÉgÇÕÉRÉåÉNÉVÉáÉìÉ^ÉOÇΔ ID Ç…ÇÊǡǃéØï Ç≥ÇÍÇ‹Ç∑ÅBäeÉpÉâÉÅÅ[É^ÇÃà”ñ°ÇΔÉfÅ[É^ç\ë¢ÇÕDZÇÍÇÁÇégópÇ∑ÇÈÉZÉNÉVÉáÉìÇ≈è⁄ǵÇ≠ê‡ñæÇµÇ‹Ç∑ÅB

PrintingLib Ç…ÇÕDZÇÍÇÁÇÃÉRÉåÉNÉVÉáÉìÇ…ÉAÉNÉZÉXÇ∑ÇÈÉãÅ[É`ÉìǙdžÇËÇ‹Ç∑ÅBè⁄ç◊DžǬǢǃÇÕÅAê›íËÉâÉCÉuÉâÉä (SettingsLib) ÇÃÉhÉLÉÖÉÅÉìÉgÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅBÉRÉåÉNÉVÉáÉìÇ…ÉAÉNÉZÉXÇ∑ÇÈèÍçáÇÕïKÇ∏DZÇÍÇÁÇÃÉãÅ[É`ÉìÇégópǵǃÇ≠ÇæÇ≥Ç¢ÅBÉãÅ[É`ÉìÇÃǻǩDžÇÕÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃê›íËÉtÉ@ÉCÉãÇÃñºëOÇïKóvÇΔÇ∑ÇÈLJÇÃǙdžÇËÇ‹Ç∑ÅBLaserWriter ÇÃèÍçáÅAê›íËÉtÉ@ÉCÉãÇÃñºëOÇÕ LaserWriter ÉtÉ@ÉCÉãÇà 'STR ' ÉäÉ\Å[ÉXÅAID -8185 Ç…ï€ë∂Ç≥ÇÍǃǢNjÇ∑ÅB

DTP ÇÃÉRÉåÉNÉVÉáÉìÇ…ÉqÉìÉgÇí«â¡Ç∑ÇÈÉãÅ[É`ÉìÇÕÅAéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB

#define kNoCollection -2
OSErr psStorePrinterName(Collection prInfo, Handle papa);
/* ÉRÉåÉNÉVÉáÉì prInfo Ç…ê≥ãKâªÇµÇΩ EntityName Çï€ë∂Ç∑ÇÈ */
Å@
/*
DTP ÇÃÉRÉåÉNÉVÉáÉìÇ…ÉqÉìÉgÇí«â¡ÇµÇ‹Ç∑ÅB
í∑Ç≥Ç™ 'size' Ç≈ 'bufP' ÇÃéwÇ∑ÉÅÉÇÉäÉuÉçÉbÉNÇÅA'tag' ÇΔ 'id' ÇéùǬÉqÉìÉgÇΔǵǃÅA
'papaH' ÇÃéwíËÇ∑ÇÈ PAPA ÇéùǬ DTP Ç…í«â¡ÇµÇ‹Ç∑ÅB
íçà”: DZÇÃÉãÅ[É`ÉìÇåƒÇ—èoÇ∑ëOÇ…ÅALaserWriter ÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJǢǃǮǩǻÇ≠ǃÇÕÇ»ÇËÇ‹ÇπÇÒÅB
*/
OSErr addHint(Handle papaH, CollectionTag tag, long id, long size, void *bufP){
Å@
	Handle lwPrefFileNameH;
	char savedHandleState;
	Collection DTPCollection;
	Å@
	// LW ÇÃê›íËÉtÉ@ÉCÉãÇÃñºëOÇ™ïKóv
	lwPrefFileNameH= GetString(-8185 );
	// ÉGÉâÅ[èàóùÇñYÇÍǻǢÇÊǧDž
	savedHandleState = HGetState(inHandle);
	HLock(lwPrefFileNameH);
	// SettingsLib ÇÃÉãÅ[É`ÉìÇ≈ÉRÉåÉNÉVÉáÉìÇéÊìæÇµçÄñ⁄Çí«â¡Ç∑ÇÈ
	DTPCollection= psGetPrefsPrinterInfo((StringPtr)(*lwPrefFileNameH), papaH);
	if(DTPCollection== nil)
		// ÉGÉâÅ[èàóùÇñYÇÍǻǢÇÊǧDž
		err = kNoCollection;
	Å@
	err = psStorePrinterName(DTPCollection, papaH);
	// ÉGÉâÅ[èàóù
	err = AddCollectionItem(DTPCollection, tag, id, size, bufP);
	// ÉGÉâÅ[èàóù
	err = psUpdatePrefsPrinterInfo(*lwPrefFileNameH, papaH, DTPCollection);
	DisposeCollection(DTPCollection);
	// å„énññ
	HSetState(lwPrefFileNameH, savedHandleState );
	ReleaseResource(lwPrefFileNameH);
	return (err);
}

Å@

Ç∑Ç◊ǃÇÃÉ^ÉCÉvÇà DTP Ç…ëŒÇµÇƒ PPD ÉtÉ@ÉCÉãÇéwíËÇ∑ÇÈDZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅBéüÇÃÉãÅ[É`ÉìÇÕǪÇÃï˚ñ@Ç≈Ç∑ÅB

OSStatus psGetPPDInfo(FSSpecPtr driver, Handle papaH,
		long structVersion, PrinterPPDInfo *ppdInfo);
/* 'driver' Ç‚ 'papaH' Ç≈éwíËÇ≥ÇÍÇΩÉvÉäÉìÉ^Çà PPD èÓïÒÇï‘ǵNjÇ∑ÅB
PPD èÓïÒÇÕ *'ppdInfo' Ç…ï‘ǵNjÇ∑ÅB
åƒÇ—èoǵë§ÇÕégópÇ∑ÇÈ PrinterPPDInfo ç\ë¢ëÃÇÃÉoÅ[ÉWÉáÉìÇìnÇ≥Ç»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB
DZÇÍÇÕíËêîÇà 'kPPDInfoStructVersion' Ç≈Ç»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB
åƒÇ—èoǵë§ÇÃç\ë¢ëÃÇÃÉoÅ[ÉWÉáÉìÇ™çáÇÌǻǢÇΔ 'errWrongStructVersion' Çï‘ǵNjÇ∑ÅB
*/
Å@
OSStatus psSetPPDInfo(FSSpecPtr driver, Handle papaH,
		long structVersion, PrinterPPDInfo *ppdInfo);
/* PPD ÉtÉ@ÉCÉãÇΔÅA'driver' Ç‚ 'papaH' Ç≈éwíËÇ≥ÇÍÇΩÉvÉäÉìÉ^ÇÃ
âêÕçœÇ› PPD ÉtÉ@ÉCÉãÇê›íËǵNjÇ∑ÅB
PPD ÉtÉ@ÉCÉãÇà FFSpec ÇΔâêÕçœÇ› PPD ÉtÉ@ÉCÉãÇÕÅAîƒópÇà PPD ÇégǧÇ◊ǴǩǫǧǩÇéwé¶
Ç∑ÇÈÉtÉâÉOÇΔÇΔLJDžÅAppdinfo ÇÃéwÇ∑ç\ë¢ëÃÇ≈ìnÇ≥ÇÍÇ‹Ç∑ÅB
îƒóp PPD ÉtÉâÉOÇ™ê›íËÇ≥ÇÍǃǢÇÈèÍçáÇÕÅAâêÕ PPD Çà FFSpec ÇæÇØÇ™óLå¯Ç≈džÇÍÇŒè\ï™Ç≈Ç∑ÅB
structVersion ÇÕåƒÇ—èoǵë§Ç™égópǵǃǢÇÈ PrinterPPDInfo ç\ë¢ëÃÇÃÉoÅ[ÉWÉáÉìÇé¶ÇµÇ‹Ç∑ÅB
åƒÇ—èoǵë§ÇÕíËêîÇìnÇ≥Ç»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅB
*/
Å@
OSErr ppdGetParseFolder(FSSpecPtr parseFolder);
/*
parseFolder Ç™éwÇ∑ FFSpec Ç…âêÕçœÇ› PPD ÉtÉHÉãÉ_Çà 'vRefNum' ÇΔ 'parID' Çê›íËǵNjÇ∑ÅB
ÉNÉâÉCÉAÉìÉgÇÕâêÕçœÇ› PPD ÉtÉ@ÉCÉãñºÇ FFSpec Çà 'name' ÉtÉBÅ[ÉãÉhÇ…ê›íËǵÅAÉtÉ@ÉCÉã
É}ÉlÅ[ÉWÉÉÇà Open åƒÇ—èoǵÇ≈âêÕçœÇ› PPD ÇäJÇ≠DZÇΔÇ™Ç≈Ç´Ç‹Ç∑ÅB
*'parseFolder' ÇÕâêÕçœÇ› PPD ÉtÉHÉãÉ_Çà FFSpec Ç≈ÇÕǻǢDZÇΔÇ…íçà”ǵǃÇ≠ÇæÇ≥Ç¢ÅB
*/
Å@
OSErr ppdParseFile (const FSSpec *ppdFileSpec, short compiledRef, short compiledResFRef,
		PPDParseErr *errInfoP);
/* PPD ÉtÉ@ÉCÉãÇ®ÇÊÇ—Ç∑Ç◊ǃÇà include ÇâêÕǵNjÇ∑ÅB
FFSpecPtr ÇÕèIóπéûÇ…ÉNÉçÅ[ÉYÇ≥ÇÍÇ‹Ç∑ÅB
PDD ÉtÉ@ÉCÉãÇÃâêÕåãâ ÇÕÉtÉ@ÉCÉãéQèΔÇà 'compiledRef' Ç≈äJÇ¢ÇΩÉtÉ@ÉCÉãÇ…èoóÕÇ≥ÇÍÇ‹Ç∑ÅB
compiledResFRef Ç™ -1 Ç≈ǻǢÇΔÅAPPD ÉtÉ@ÉCÉãÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇǪDZDžÉRÉsÅ[ǵNjÇ∑ÅB
'errInfoP' Ç™ NULL à»äOÇæÇΔÅAÉGÉâÅ[èÓïÒǙdžÇÍÇŒÅA*'errInfoP' Ç…ï‘ǵNjÇ∑ÅB
*/
Å@
enum PPDPresetSource {
	kPPDSourceUnknown = -1,
	kPPDSourceRSRC = 0,
	kPPDSourceGeneric = 1,
	kPPDSourceCustom = 2
};
Å@
typedef enum{
	kTriFalse = 0,
	kTriTrue,
	kTriUnknown
} TriState;
Å@
struct CustPPDInfo {
	Boolean usePPD;
	FSSpec fileSpec;
};
typedef struct CustPPDInfo CustPPDInfo, **CustPPDHandle;
Å@
typedef struct {
short presetSource; /* enum PPDPresetSource */
	TriState isSetup;
	CustPPDInfo customPPD;
} WhatPPD;
Å@
typedef struct PrinterPPDInfo{
	long structVersion; // ç\ë¢ëÃÇÃÉoÅ[ÉWÉáÉìÇé¶Ç∑
	Boolean useGenericPPD; // îƒóp PPD ÇégópÇ∑ÇÈèÍçáÇÕ True
	FSSpec ppdFile; // åªç›Çà PPD ÉtÉ@ÉCÉãÇà FSSpec
	FSSpec parsedPPDFile; // ÉvÉäÉìÉ^ÇÃâêÕçœÇ› PPD ÉtÉ@ÉCÉãÇà FSSpec
}PrinterPPDInfo;
Å@
/*
DZÇÃÉãÅ[É`ÉìÇÕÅAppdFsSpec Ç…ÇÊǡǃéwíËÇ≥ÇÍÇΩ ppd ÉtÉ@ÉCÉãÇâêÕǵÅA
ëŒâûÇ∑ÇÈÉqÉìÉgÇ papaH Ç…ÇÊǡǃéwíËÇ≥ÇÍÇΩ DTP Ç…í«â¡ÇµÇ‹Ç∑ÅB
*/
OSErr SetPPD(FSSpec* ppdFsSpecP, Handle papaH, FSSpec* laserWriterFsSpecP)
{
	OSErr err = noErr;
	FSSpec parsedPPD;
	WhatPPD whatPPD;
	short savedResFile = ::CurResFile();
	Boolean isGeneric = false;
	short dataForkRefNum, resourceForkRefNum;
	PrinterPPDInfo ppdInfo;
	Å@
	// ÉfÉtÉHÉãÉg
	whatPPD.presetSource = kPPDSourceCustom;
	whatPPD.isSetup = kTriTrue;
	whatPPD.customPPD.usePPD = TRUE;
	whatPPD.customPPD.fileSpec = *ppdFsSpecP;
	Å@
	// âêÕçœÇ› PPD Çà FSSpec ÇÃèÄîı
	err = ppdGetParseFolder(&parsedPPD);
	ThrowIfOSErr_(err);
	CopyPStr(ppdFsSpecP->name, parsedPPD.name, sizeof(parsedPPD.name));
	Å@
	// âêÕçœÇ›ÉtÉ@ÉCÉãÇçÏê¨ÇµÅAÉäÉ\Å[ÉXÅ^ÉfÅ[É^ÉtÉHÅ[ÉNÇäJÇ≠
	FSpCreateResFile(&parsedPPD, 'vgrd', 'Pref', smSystemScript);
	err = SpOpenDF(&parsedPPD, fsRdWrPerm, &dataForkRefNum);
	resourceForkRefNum = ::FSpOpenResFile(&parsedPPD, fsRdWrPerm);
	// PPD ÇÃâêÕ
	err = ppdParseFile (ppdFsSpecP, dataForkRefNum, resourceForkRefNum, NULL);
	// ÉäÉ\Å[ÉXÅ^ÉfÅ[É^ÉtÉHÅ[ÉNÇï¬Ç∂ÇÈ
	CloseResFile(resourceForkRefNum);
	err = FSClose(dataForkRefNum);
	UseResFile(savedResFile);
	Å@
	// PPD ÇÉvÉäÉìÉ^ÇΔåãçá
	err = addHint(papaH, 'pppd', 1, sizeof(parsedPPD), &parsedPPD);
	err = addHint(papaH, 'ppd ', 1, sizeof(whatPPD), &whatPPD);
	// ÉfÉtÉHÉãÉgÉqÉìÉgÇê›íË
	err = psGetPPDInfo(laserWriterFsSpecP, papaH, 2, &ppdInfo);
	if(!err) err = psSetPPDInfo(laserWriterFsSpecP, papaH, 2, &ppdInfo);
	Å@
	return (err);
}

Å@

LaserWriter óp PAP ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÃçÏê¨

PAP DTP óp LaserWriterExtra ÉãÅ[É`ÉìÇÕéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB

// ---------------------------------------------------------------------------
// LaserWriter 8.5.1 óp LaserWriterExtra
// åªç›ÇÃÉvÉäÉìÉ^ÇÉ^Å[ÉQÉbÉgDžǵNjÇ∑ÅB
// ---------------------------------------------------------------------------
LaserWriterExtra(FSSpec *printerDrvrFsSpecP,
		ConstStr32Param inZone,
		ConstStr32Param inPrinterName)
{
	OSErr err;
	short refNum;
	Handle papaH;
	short savedResFile = CurResFile();
	SSpec ppdFsSpec;
	Å@
	// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠
	err = FSpOpenResFile(printerDrvrFsSpecP, fsWrPerm, &refNum);
	// ÉGÉâÅ[èàóù
	Å@
	// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ©ÇÁ PAPA ÉäÉ\Å[ÉXÇéÊìæ
	papaH= Get1Resource('PAPA' , -8192);
	// ÉGÉâÅ[èàóù
	Å@
	// PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX
	// SettingsLib édólèëÇà psSetPapPapa ÇéQèΔ
	err = psSetPapPapa(papaH, inPrinterName,
		(const Byte *)("\pLaserWriter"), inZone, 0);
	// ÉGÉâÅ[èàóù
	Å@
	// PPD ÉtÉ@ÉCÉãÇ ppdFsSpec Ç≈éwíË
	err = FSMakeFSSpec(vRefNum,dirID,fileName,&ppdFsSpec);
	err = SetPPD(&ppdFsSpec, papaH, printerDrvrFsSpecP);
	Å@
	ChangedResource(papaH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑
	WriteResource(papaH); // ÉäÉ\Å[ÉXÇçXêV
	err = FSClose(refNum);
	UseResFile(savedResFile);
}

Å@

LaserWriter óp LPR ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÃçÏê¨

LPR DTP Ç…ÇÕÉhÉÅÉCÉìÉAÉhÉåÉXÇΔÉLÉÖÅ[ÇéwíËÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBDZÇÍÇÁÇÕ 'LpIa' ÉqÉìÉgÇΔǵǃéwíËǵNjÇ∑ÅB'LpIa' ÇÃÉtÉHÅ[É}ÉbÉgÇÕÅAÉvÉäÉìÉ^ÇÃÉhÉÅÉCÉìÉAÉhÉåÉX (ÉpÉXÉJÉãï∂éöóÒ) Ç…ë±ÇØÇƒÉLÉÖÅ[ÇÃñºëO (ÉpÉXÉJÉãï∂éöóÒ) ÇǬǻÇ∞ÇΩå`éÆÇ≈Ç∑ÅB

LPR DTP óp LaserWriterExtra ÉãÅ[É`ÉìÇÕéüÇÃÇÊǧDžǻÇËÇ‹Ç∑ÅB

// ---------------------------------------------------------------------------
// LaserWriter 8.5.1 óp LaserWriterExtra
// åªç›ÇÃÉvÉäÉìÉ^ÇÉ^Å[ÉQÉbÉgDžǵNjÇ∑ÅB
// inTcpAddr ÇÕ LPR ÉvÉäÉìÉ^ÇÃÉlÉbÉgÉèÅ[ÉNÉAÉhÉåÉXÇ≈Ç∑ÅB
// DZÇÃÉAÉhÉåÉXÇÕÅAñºëOÇÃå`éÆÇ≈LJÉhÉbÉgå`éÆÇ≈LJéwíËÇ≈Ç´Ç‹Ç∑ÅB
// ó·Ç¶ÇŒ "\plaser.rbi.com" Ç‹ÇΩÇÕ "\p204.188.109.155" ÇΔÇ»ÇËÇ‹Ç∑ÅB
// inQName ÇÕ inTcpAddr ÇÃÉXÉvÅ[ÉâÇ…äÑÇËìñǃÇÁÇÍÇΩÉvÉäÉìÉgÉLÉÖÅ[ÇÃ
// ñºëOÇ≈Ç∑ÅBinQName Ç™ NULL ÇæÇΔÅAÉvÉäÉìÉ^Å^ÉXÉvÅ[ÉâÇÃÉfÉtÉHÉãÉgÇÃ
// ÉLÉÖÅ[ÇégópǵNjÇ∑ÅB
// ---------------------------------------------------------------------------
LaserWriterExtra(FSSpec *printerDrvrFsSpecP,
		ConstStr32Param inTcpAddr,
		ConstStr32Param inPrinterName,
		ConstStr32Param inQName)
{
	OSErr err;
	short refNum;
	Handle papaH;
	Handle ipAddrQueueH;
	short savedResFile = CurResFile();
	Å@
	// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠
	err = FSpOpenResFile(printerDrvrFsSpecP, fsWrPerm, &refNum);
	// ÉGÉâÅ[èàóù
	Å@
	// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ©ÇÁ PAPA ÉäÉ\Å[ÉXÇéÊìæ
	papaH= Get1Resource('PAPA' , -8192);
	// ÉGÉâÅ[èàóù
	Å@
	// PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX
	// SettingsLib édólèëÇà psSetLprPapa ÇéQèΔ
	err = psSetLprPapa(papaH, inPrinterName, (const Byte *)("\p=LPR"),
		(const Byte *)(*inTcpAddr), (const Byte *)inQName);
		// ÉGÉâÅ[èàóù
	Å@
	// PPD ÉtÉ@ÉCÉãÇ ppdFsSpec Ç≈éwíË
	err = FSMakeFSSpec(vRefNum,dirID,fileName,&ppdFsSpec);
	err = SetPPD(&ppdFsSpec, papaH, printerDrvrFsSpecP);
	Å@
	// ÉvÉäÉìÉ^ÇÃÉhÉÅÉCÉìÉAÉhÉåÉXÇΔÉLÉÖÅ[ÇéwíË
	err = PtrToHand(inTcpAddr, &ipAddrQueueH, inTcpAddr[0] + 1);
	err = PtrAndHand(inQName, ipAddrQueueH, inQName[0] + 1);
	HLock(ipAddrQueueH);
	err = addHint(papaH, 'LpIa', 1, GetHandleSize(ipAddrQueueH), *ipAddrQueueH);
	HUnlock(ipAddrQueueH);
	DisposHandle(ipAddrQueueH);
	Å@
	ChangedResource(papaH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑
	WriteResource(papaH); // ÉäÉ\Å[ÉXÇçXêV
	err = FSClose(refNum);
	UseResFile(savedResFile);
}

Å@

LaserWriter ópê‘äOê¸ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÃçÏê¨

// ---------------------------------------------------------------------------
// LaserWriter 8.5.1 óp LaserWriterExtra
// åªç›ÇÃÉvÉäÉìÉ^ÇÉ^Å[ÉQÉbÉgDžǵNjÇ∑ÅB
// ---------------------------------------------------------------------------
LaserWriterExtra(FSSpec *printerDrvrFsSpecP,
		ConstStr32Param inPrinterName)
{
	OSErr err;
	short refNum;
	Handle papaH;
	short savedResFile = CurResFile();
	Å@
	// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠
	err = FSpOpenResFile(printerDrvrFsSpecP, fsWrPerm, &refNum);
	// ÉGÉâÅ[èàóù
	Å@
	// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ©ÇÁ PAPA ÉäÉ\Å[ÉXÇéÊìæ
	papaH= Get1Resource('PAPA' , -8192);
	// ÉGÉâÅ[èàóù
	Å@
	// PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX
	// SettingsLibédólèëÇÃpsSetInfraredPapaÇéQèΔ
	err = psSetInfraredPapa(papaH, inPrinterName, ("\p=Ird"));
	// ÉGÉâÅ[èàóù
	Å@
	// PPD ÉtÉ@ÉCÉãÇ ppdFsSpec Ç≈éwíË
	err = FSMakeFSSpec(vRefNum,dirID,fileName,&ppdFsSpec);
	err = SetPPD(&ppdFsSpec, papaH, printerDrvrFsSpecP);
	Å@
	ChangedResource(papaH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑
	WriteResource(papaH); // ÉäÉ\Å[ÉXÇçXêV
	err = FSClose(refNum);
	UseResFile(savedResFile);
}
Å@

LaserWriter ópï€óØÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÃçÏê¨

// ---------------------------------------------------------------------------
// LaserWriter 8.5.1 óp LaserWriterExtra
// åªç›ÇÃÉvÉäÉìÉ^ÇÉ^Å[ÉQÉbÉgDžǵNjÇ∑ÅB
// ---------------------------------------------------------------------------
LaserWriterExtra(FSSpec *printerDrvrFsSpecP,
		ConstStr32Param inPrinterName)
{
	OSErr err;
	short refNum;
	Handle papaH;
	short savedResFile = CurResFile();
	Å@
	// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠
	err = FSpOpenResFile(printerDrvrFsSpecP, fsWrPerm, &refNum);
	// ÉGÉâÅ[èàóù
	Å@
	// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ©ÇÁ PAPA ÉäÉ\Å[ÉXÇéÊìæ
	papaH= Get1Resource('PAPA' , -8192);
	// ÉGÉâÅ[èàóù
	Å@
	// PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX
	// See SettingsLib Spec for psSetHoldPapa
	err = psSetHoldPapa(papaH, inPrinterName, ("\p=Hld"));
	// ÉGÉâÅ[èàóù
	Å@
	// PPD ÉtÉ@ÉCÉãÇ ppdFsSpec Ç≈éwíË
	err = FSMakeFSSpec(vRefNum,dirID,fileName,&ppdFsSpec);
	err = SetPPD(&ppdFsSpec, papaH, printerDrvrFsSpecP);
	Å@
	ChangedResource(papaH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑
	WriteResource(papaH); // ÉäÉ\Å[ÉXÇçXêV
	err = FSClose(refNum);
	UseResFile(savedResFile);
}
Å@

LaserWriter óp PostScript ÉgÉâÉìÉXÉåÅ[É^ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÃçÏê¨

PostScript ÉgÉâÉìÉXÉåÅ[É^ DTP ÇÃèÍçáÅAïœä∑çœÇÃÉtÉ@ÉCÉãÇï€ë∂Ç∑ÇÈÉfÉtÉHÉãÉgÇÃäiî[êÊÉtÉHÉãÉ_Ç 'Pdka' ÉqÉìÉgÇΔǵǃéwíËÇµÇ»ÇØÇÍnjǻÇËÇ‹ÇπÇÒÅBÅuÉtÉ@ÉCÉãÇ…àÛç¸ÅvÇ∑ÇÈDZÇΔÇé¶Ç∑ÇΩÇflÅA'Svap' LJéwíËÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅB

struct SaveAsFilePrefs{
	Boolean saveToFile; // ÉtÉ@ÉCÉãÇ…àÛç¸Ç∑ÇÈèÍçáÇÕ True
	Boolean restricted; // ÉtÉ@ÉCÉãÇ…àÛç¸Ç∑ÇÈèÍçáÇÕ True
};
Å@
// ---------------------------------------------------------------------------
// LaserWriter 8.5.1 óp LaserWriterExtra
// åªç›ÇÃÉvÉäÉìÉ^ÇÉ^Å[ÉQÉbÉgDžǵNjÇ∑ÅB
// ---------------------------------------------------------------------------
LaserWriterExtra(FSSpec *printerDrvrFsSpecP,
		ConstStr32Param inPrinterName,
		FSSpec* destinationFolderP)
{
	OSErr err;
	short refNum;
	Handle papaH;
	SaveAsFilePrefs saveToFilePref;
	AliasHandle printToDiskAliasH;
	short savedResFile = CurResFile();
	Å@
	// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠
	err = FSpOpenResFile(printerDrvrFsSpecP, fsWrPerm, &refNum);
	// ÉGÉâÅ[èàóù
	Å@
	// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ©ÇÁ PAPA ÉäÉ\Å[ÉXÇéÊìæ
	papaH= Get1Resource('PAPA' , -8192);
	// ÉGÉâÅ[èàóù
	Å@
	// PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX
	// SettingsLib édólèëÇà psSetFilePapa
	err = psSetFilePapa(papaH, inPrinterName, "\p=Fil");
	// ÉGÉâÅ[èàóù
	Å@
	// PPD ÉtÉ@ÉCÉãÇ ppdFsSpec Ç≈éwíË
	err = FSMakeFSSpec(vRefNum,dirID,fileName,&ppdFsSpec);
	err = SetPPD(&ppdFsSpec, papaH, printerDrvrFsSpecP);
	Å@
	// ÉfÉBÉXÉNÉqÉìÉgÇ÷àÛç¸
	saveToFilePref.saveToFile = TRUE;
	saveToFilePref.restricted = TRUE;
	prefCollection.AddItem('Svap', 1, sizeof(saveToFilePref), &saveToFilePref);
	Å@
	// ÉfÉBÉXÉNÇÃÉfÉtÉHÉãÉgÉtÉHÉãÉ_Ç…àÛç¸Ç∑ÇÈÇÊǧê›íË
	err = NewAliasMinimal(destinationFolderP, &printToDiskAliasH);
	HLock((Handle)printToDiskAliasH);
	err = addHint(papaH, 'Pdka', 1,
	GetHandleSize((Handle)printToDiskAliasH), *printToDiskAliasH);
	HUnlock((Handle)printToDiskAliasH);
	DisposeHandle((Handle)printToDiskAliasH);
	Å@
	// PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX
	ChangedResource(papaH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑
	WriteResource(papaH); // ÉäÉ\Å[ÉXÇçXêV
	err = FSClose(refNum);
	UseResFile(savedResFile);
}
Å@

LaserWriter ópÉJÉXÉ^ÉÄÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇÃçÏê¨

ÉfÉxÉçÉbÉpÇ™ÉJÉXÉ^ÉÄ DTP ÇégópÇ∑ÇÈï˚ñ@ÇΔÅAÉAÉbÉvÉãÇÃÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÉÜÅ[ÉeÉBÉäÉeÉBÇïœçXǵǃì¡íËÇÃå„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃé¿çsÇÉTÉ|Å[ÉgÇ∑ÇÈï˚ñ@ÇÃè⁄ç◊DžǬǢǃÇÕÅuTECHNOTE 1113: ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÉÜÅ[ÉeÉBÉäÉeÉBÇÃÉJÉXÉ^É}ÉCÉYÅvÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB

ÉJÉXÉ^ÉÄ DTP Ç…ÇÕǪÇÍǺÇÍÅALaserWriter Ç™ãNìÆÇ∑ÇÈå„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇéwíËÇ∑ÇÈïKóvǙdžÇËÇ‹Ç∑ÅBå„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇÕ AliasHandle ÇΔǵǃÅA'TGap' ÉqÉìÉgì‡Ç…éwíËǵNjÇ∑ÅB

åªç›ÉTÉ|Å[ÉgÇ≥ÇÍǃǢÇÈÉJÉXÉ^ÉÄ DTP ÇÃÉqÉìÉgÇÕÅA'PSlv'ÅA'BNok'ÅA'JObt'ÅA'FOnt' Ç≈Ç∑ÅBDZÇÍÇÁÇÃÉqÉìÉgÇÃà”ñ°ÇΔÉfÅ[É^ç\ë¢ëÃDžǬǢǃÇÕÅuTECHNOTE 1113: ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÉÜÅ[ÉeÉBÉäÉeÉBÇÃÉJÉXÉ^É}ÉCÉYÅvÇ≈ê‡ñæÇµÇƒÇ¢Ç‹Ç∑ÅB

éüÇÃÉãÅ[É`ÉìÇÕDZǧǵÇΩÉpÉâÉÅÅ[É^ÇÉJÉXÉ^ÉÄ DTP ÇÃÉRÉåÉNÉVÉáÉìÇ…í«â¡Ç∑ÇÈï˚ñ@Çé¶ÇµÇΩLJÇÃÇ≈Ç∑ÅBFOntHint Ç®ÇÊÇ— CustomAppDesc ç\ë¢ëÃÇÃè⁄ç◊DžǬǢǃÇÕÅuTECHNOTE 1113: ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÉÜÅ[ÉeÉBÉäÉeÉBÇÃÉJÉXÉ^É}ÉCÉYÅvÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB

typedef struct{ // ÅuÉJÉXÉ^ÉÄ DTPÅvÇÃê‡ñæÇéQèΔ
	long flag; // kIncludeAllFontsBut Ç‹ÇΩÇÕ kIncludeAllFontsBut
	unsigned char name[1]; // ÉtÉHÉìÉgñº
}FOntHint;
Å@
struct CustomAppDesc{
	OSType appSignature; // å„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉVÉOÉlÉ`ÉÉ
	Str255 docType; // êVãKÉÅÉjÉÖÅ[ÇÃï∂èëÉäÉXÉgÇ…èoÇ∑ñºëO
	Str255 helpText; // lin43 - DZÇÃÉ^ÉCÉvÇà DTP Ç™ëIëÇ≥ÇÍÇΩÇΔÇ´Ç…èoÇ∑
	Str255 usage; // ÉEÉBÉìÉhÉEÇ…èoÇ∑ DTP óòópèÛãµ
	Str255 appFileName; // ÉGÉâÅ[ÉÅÉbÉZÅ[ÉWǻǫÇ≈égÇÌÇÍÇÈÉfÉtÉHÉãÉgÉAÉvÉäÉPÅ[ÉVÉáÉìÉtÉ@ÉCÉãñº
	short numOfHintsFollow; // 1 Ç©ÇÁénÇ‹ÇÈ
	HintRsrcSpec hintRsrc[1]; // â¬ïœí∑
};
typedef struct CustomAppDesc CustomAppDesc;
typedef struct CustomAppDesc* CustomAppDescPtr;
typedef struct CustomAppDesc** CustomAppDescHdl;
Å@
/*
DZÇÃÉãÅ[É`ÉìÇÕÉJÉXÉ^ÉÄ DTP ÇÃÉqÉìÉgÇ DTP ÇéwíËÇ∑ÇÈ papaH Ç…í«â¡ÇµÇ‹Ç∑ÅB
ppApp ÇÕå„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇà FSSpec ÇéwǵNjÇ∑ÅB
å„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇà AliasHandle ÇÃê∂ê¨ñ@ÇΔÅA'TGap' ÉqÉìÉgÇΔǵǃí«â¡Ç∑ÇÈï˚ñ@Ç…íçñ⁄ǵǃÇ≠ÇæÇ≥Ç¢ÅB
*/
OSErr addCustomDtpParameters(FSSpec* ppApp, Handle papaH)
{
	OSErr err;
	long psLevel = 1; // PostScript ÉåÉxÉã 1
	Byte binaryOK = 0; // false
	char job = 0; // psJobPostScript
	FOntHint fontHint;
	AliasHandle targetAppAliasH;
	CustomAppDesc customAppDesc;
	Å@
	// PostScript ÉåÉxÉã 1
	err = addHint(papaH, 'PSlv', 1, siezof(psLevel ), &psLevel ){
	// ÉoÉCÉiÉäÇÕégópǵǻǢ
	err = addHint(papaH, 'BNok', 1, siezof(binaryOK ), &binaryOK ){
	// PostScript ÉWÉáÉu
	err = addHint(papaH, 'JObt', 1, siezof(job ), &job ){
	// includeAllFonts
	fontHint.flag = 1;
	fontHint.name [0] = 0;
	err = addHint(papaH, 'FOnt', 1, siezof(fontHint), &fontHint){
	Å@
	// É^Å[ÉQÉbÉgÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃèÍèäÇï€ë∂
	err = ::NewAliasMinimal(ppApp, &targetAppAliasH);
	// ÉGÉâÅ[èàóù
	::HLock((Handle)targetAppAliasH);
	err = addHint('TGap', 1,
	GetHandleSize((Handle)targetAppAliasH), *targetAppAliasH);
	::HUnlock((Handle)targetAppAliasH);
	::DisposeHandle((Handle)targetAppAliasH);
	Å@
	// ÉAÉbÉvÉãÇÃÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÉÜÅ[ÉeÉBÉäÉeÉBÇ… DTP ÇîFéØÇµÇƒÇ‡ÇÁÇ¢ÅA
	// äJǢǃLJÇÁǧÇΩÇflÇ…ÇÕÅA'CsDs' ÉqÉìÉgÇí«â¡ÇµÇ»ÇØÇÍnjǻÇÁǻǢ
	Å@
	// å„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇà customAppDesc ç\ë¢ëÃÇÃÉtÉBÅ[ÉãÉhÇê›íË
	customAppDesc.appSignature = 'xxxx'; // å„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃÉVÉOÉiÉ`ÉÉ
	/* ǪÇÃëºÇÃÉtÉBÅ[ÉãÉhLJÇ∑Ç◊ǃ
	*/
	// ÉJÉXÉ^ÉÄÉAÉvÉäÉPÅ[ÉVÉáÉìÇÃê‡ñæÇï€ë∂
	err = addHint(('CsDs', 1, sizeof(customAppDesc), &customAppDesc);
	return err;
}
Å@
// ---------------------------------------------------------------------------
// LaserWriter 8.5.1 óp LaserWriterExtra
// åªç›ÇÃÉvÉäÉìÉ^ÇÉ^Å[ÉQÉbÉgDžǵNjÇ∑ÅB
// ---------------------------------------------------------------------------
LaserWriterExtra(FSSpec *printerDrvrFsSpecP,
		ConstStr32Param inPrinterName)
{
	OSErr err;
	FSSpec postProcessAppFsSpec;
	short refNum;
	Handle papaH;
	short savedResFile = CurResFile();
	Å@
	// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇÃÉäÉ\Å[ÉXÉtÉHÅ[ÉNÇäJÇ≠
	err = FSpOpenResFile(printerDrvrFsSpecP, fsWrPerm, &refNum);
	// ÉGÉâÅ[èàóù
	Å@
	// ÉvÉäÉìÉ^ÉhÉâÉCÉoÇ©ÇÁ PAPA ÉäÉ\Å[ÉXÇéÊìæ
	papaH= Get1Resource('PAPA' , -8192);
	// ÉGÉâÅ[èàóù
	Å@
	// SettingsLib édólèëÇà psSetCustomPapa ÇéQèΔ
	err = psSetCustomPapa(papaH, inPrinterName, "\p=Cst");
	// ÉGÉâÅ[èàóù
	Å@
	// PPD ÉtÉ@ÉCÉãÇ ppdFsSpec Ç≈éwíË
	err = FSMakeFSSpec(vRefNum,dirID,fileName,&ppdFsSpec);
	err = SetPPD(&ppdFsSpec, papaH, printerDrvrFsSpecP);
	Å@
	// å„èàóùÉAÉvÉäÉPÅ[ÉVÉáÉìÇΔëºÇÃÉpÉâÉÅÅ[É^ÇéwíË
	err = FSMakeFSSpec(vRefNum, dirID, "\pYourPostProcessAppName", &postProcessAppFsSpec);
	err = addCustomDtpParameters(&postProcessAppFsSpec, papaH);
	Å@
	// PAPA ÉäÉ\Å[ÉXÇÃì‡óeÇïœçX
	ChangedResource(papaH); // ïœçXǙdžǡÇΩDZÇΔÇé¶Ç∑
	WriteResource(papaH); // ÉäÉ\Å[ÉXÇçXêV
	err = FSClose(refNum);
	UseResFile(savedResFile);
}
Å@

Ç‹ÇΔÇfl

DZÇà TECHNOTE Ç≈äTê‡ÇµÇΩÇÊǧDžÅAÉvÉçÉOÉâÉÄÇÃé¿çsíÜÇ…ÉfÉXÉNÉgÉbÉvÉvÉäÉìÉ^ÇçÏê¨Ç∑ÇÈÇ…ÇÕÇøÇÂÇ¡ÇΔǵÇΩçÏãΔÇ™ïKóvÇ≈Ç∑ÅBǵǩǵÅADZDZÇ≈é¶ÇµÇΩíçà”ÇéÁǡǃçsǶnjÅAëΩÇ≠ÇÃÉAÉvÉäÉPÅ[ÉVÉáÉìÇ…ÇΔǡǃÅAâøíldžÇÈçÏãΔÇΔÇ»ÇÈÇÕÇ∏Ç≈Ç∑ÅBÇ™ÇÒnjǡǃÇ≠ÇæÇ≥Ç¢ÅB

Å@

éQçlï∂å£